import {IconifyJSON} from '@iconify/types'
import {IconifyIcon} from '@iconify/vue'
import {FetchUtil} from '@xtail/req'

/**
 * 获取 Iconify 指定图标集中的指定图标数据
 *
 * @param {string} prefix 图标集前缀，用于指定要获取的图标数据所在的图标集
 * @param {string[]} icons 图标名称列表，用于指定要获取图标数据的图标名称
 * @returns {Promise<IconifyJSON>} Iconify 指定图标集指定图标数据对象，要获取的图标数据以对象形式存放在返回对象的 icons 属性中，其中，图标名称为
 * key，图标数据为 value
 */
export const getIconsData = async (prefix: string, icons: string[]): Promise<IconifyJSON> => {
  let url = `https://api.iconify.design/${prefix}.json?icons=${icons.join(',')}&pretty=1`
  return await FetchUtil.req({url})
}

export type GetIconifyIconsDataType = typeof getIconsData

/**
 * 获取 Iconify 指定图标集中的指定图标数据
 *
 * @param {string} prefix 图标集前缀，用于指定要获取的图标数据所在的图标集
 * @param {string} icon 图标名称，用于指定要获取图标数据的图标名称
 * @returns {Promise<IconifyJSON>} Iconify 指定图标集指定图标数据对象，要获取的图标数据以对象形式存放在返回对象的 icons 属性中，其中，图
 * 标名称为 key，图标数据为 value
 */
export const getIconData = async (prefix: string, icon: string): Promise<IconifyJSON> => {
  return await getIconsData(prefix, [icon])
}

export type GetIconifyIconDataType = typeof getIconData

/**
 * 获取 Iconify 指定图标集中的指定图标数据，并将获取到的每个图标数据解析为 IconifyIcon 对象，以数组形式返回
 *
 * @param {string} prefix 图标集前缀，用于指定要获取的图标数据所在的图标集
 * @param {string[]} icons 图标名称列表，用于指定要获取图标数据的图标名称
 * @returns {Promise<IconifyIcon[]>} IconifyIcon 对象数组，每个对象代表一个图标，包含 body、height、width、left、top、rotate、hFlip、
 * vFlip 等属性
 */
export const getIconsDataParse = async (prefix: string, icons: string[]): Promise<IconifyIcon[]> => {
  const iconifyIconData = await getIconsData(prefix, icons)
  const iconDataList: IconifyIcon[] = []
  for (const icon in iconifyIconData.icons) {
    iconDataList.push({
      body: iconifyIconData.icons[icon].body,
      height: iconifyIconData.icons[icon].height ?? iconifyIconData.height ?? 24,
      width: iconifyIconData.icons[icon].width ?? iconifyIconData.width ?? 24,
      left: iconifyIconData.icons[icon].left ?? iconifyIconData.left ?? 0,
      top: iconifyIconData.icons[icon].top ?? iconifyIconData.top ?? 0,
      rotate: iconifyIconData.icons[icon].rotate ?? 0,
      hFlip: iconifyIconData.icons[icon].hFlip ?? false,
      vFlip: iconifyIconData.icons[icon].vFlip ?? false,
    })
  }
  return iconDataList
}

export type GetIconifyIconsDataParseType = typeof getIconsDataParse

/**
 * 获取 Iconify 指定图标集中的指定图标数据，并将获取到的每个图标数据解析为 IconifyIcon 对象，以数组形式返回
 *
 * @param {string} prefix 图标集前缀，用于指定要获取的图标数据所在的图标集
 * @param {string} icon 图标名称，用于指定要获取图标数据的图标名称
 * @returns {Promise<IconifyIcon[]>} IconifyIcon 对象数组，每个对象代表一个图标，包含 body、height、width、left、top、rotate、hFlip、
 * vFlip 等属性
 */
export const getIconDataParse = async (prefix: string, icon: string): Promise<IconifyIcon[]> => {
  return await getIconsDataParse(prefix, [icon])
}

export type GetIconifyIconDataParseType = typeof getIconDataParse
